package com.wva.redis.utils;

import lombok.RequiredArgsConstructor;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;

/**
 * @Author: hong
 * @Date: 2025/1/25 22:24:00
 */
@RequiredArgsConstructor
public class RedisUtils {
    private final StringRedisTemplate stringRedisTemplate;

    public static <T> DefaultRedisScript<T> getScriptByPath(String luaPath, Class<T> resultType) {
        DefaultRedisScript<T> defaultRedisScript = new DefaultRedisScript<>();
        defaultRedisScript.setLocation(new ClassPathResource(luaPath));
        defaultRedisScript.setResultType(resultType);
        return defaultRedisScript;
    }

    public static <T> DefaultRedisScript<T> getScriptByText(String scriptText, Class<T> resultType) {
        DefaultRedisScript<T> defaultRedisScript = new DefaultRedisScript<>();
        defaultRedisScript.setScriptText(scriptText);
        defaultRedisScript.setResultType(resultType);
        return defaultRedisScript;
    }


    /**
     * stringRedisTemplate的get方法增强，带自动类型转换和默认值
     * @param key
     * @param resultType 返回类型，只能为包装类型如String Integer Long Double
     * @param defaultVal
     * @return
     * @param <T>
     */
    public <T> T get(String key, Class<T> resultType, T defaultVal) {
        String value = stringRedisTemplate.opsForValue().get(key);
        if (value == null) return defaultVal;
        if (resultType == Integer.class) return resultType.cast(Integer.valueOf(value));
        if (resultType == Long.class) return resultType.cast(Long.valueOf(value));
        if (resultType == Double.class) return resultType.cast(Double.valueOf(value));
        return resultType.cast(value);
    }

}
